package terra.managers;

import terra.definitions.NpcDef;
import terra.model.object.NpcObject;
import terra.model.object.StaticObject;
import terra.model.object.ai.AbstractAI;

public class ObjectManager {

	// надо хранить объекты, не пересохраняя их заново при каждом обновлении.
	// при изменении минимальной или максимальной карты - удалять , и добавлять
	// нужные объекты
	// UPD может хранить объекты более 2-х карт сразу, зависит от разрешения
	// экрана игрока.
	// если 1920*1280 - то может и все 4 карты сразу будут использоваться
	public static int minIndex = -100, maxIndex = -100;
	static MapManager map = MapManager.instance;

	public static NpcObject createNpc(NpcDef def) {
		NpcObject obj = null;
		AbstractAI ai = null;
		try {
			obj = (NpcObject) Class.forName(
					"terra.model.object." + def.getStringProperty("instance"))
					.newInstance();
			if (def.getStringProperty("ai").length() > 1)
				ai = (AbstractAI) Class.forName(
						"terra.model.object.ai." + def.getStringProperty("ai"))
						.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		if (ai != null) {
			ai.setOwner(obj);
			obj.setAi(ai);
		}
		obj.setDef(def);
		obj.applyDef();
		return obj;
	}
	
	public static NpcObject createNpc(int objectId,NpcDef def) {
		NpcObject obj = null;
		AbstractAI ai = null;
		try {
			//Class.forName("").getConstructor(int.class,NpcDef.class).newInstance(initargs)
			obj = (NpcObject) Class.forName(
					"terra.model.object." + def.getStringProperty("instance"))
					.getConstructor(int.class,NpcDef.class)
					.newInstance(objectId,def);
			if (def.getStringProperty("ai").length() > 1)
				ai = (AbstractAI) Class.forName(
						"terra.model.object.ai." + def.getStringProperty("ai"))
						.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		if (ai != null) {
			ai.setOwner(obj);
			obj.setAi(ai);
		}
		obj.setDef(def);
		obj.applyDef();
		return obj;
	}

	public static StaticObject createObject(int oId, int defId,String instance) {
		StaticObject object = null;
		try {
			object  = (StaticObject) Class.forName("terra.model.object." + instance).getConstructor(int.class,int.class).newInstance(oId,defId);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return object;
	}
}
